def get_workdays_in_months(months, holidays=None, workdays=None):
    """生成指定月份的工作日，按周分组（ISO周，周一开始），返回JSON格式字符串

    规则：
    1. 以周一为一周的开始
    2. 如果某周的周一在当月，则该周属于当月
    3. 排除节假日
    4. 包含调休工作日（原本是周末但需要上班的日期）

    参数：
    - months: 月份列表，如 ["2025-10", "2025-11"]
    - holidays: 节假日列表，如 ["2025-10-01", "2025-10-02"]，为None时使用默认
    - workdays: 调休工作日列表，如 ["2025-01-26", "2025-02-08"]（原本是周末但要上班），为None时使用默认
    """
    from datetime import datetime, timedelta
    import json

    # 默认节假日（2025年）
    if holidays is None:
        holidays = [
            # 元旦（1月1日）
            "2025-01-01",
            # 春节（1月28日-2月4日，共8天）
            "2025-01-28", "2025-01-29", "2025-01-30", "2025-01-31",
            "2025-02-01", "2025-02-02", "2025-02-03", "2025-02-04",
            # 清明节（4月4日-6日）
            "2025-04-04", "2025-04-05", "2025-04-06",
            # 劳动节（5月1日-5日）
            "2025-05-01", "2025-05-02", "2025-05-03", "2025-05-04", "2025-05-05",
            # 端午节（5月31日-6月2日）
            "2025-05-31", "2025-06-01", "2025-06-02",
            # 中秋节（10月6日-8日）
            "2025-10-06", "2025-10-07", "2025-10-08",
            # 国庆节（10月1日-8日）
            "2025-10-01", "2025-10-02", "2025-10-03", "2025-10-04",
            "2025-10-05", "2025-10-06", "2025-10-07", "2025-10-08",
        ]

    # 默认调休工作日（2025年）
    if workdays is None:
        workdays = [
            # 春节调休：1月26日（周日）、2月8日（周六）上班
            "2025-01-26", "2025-02-08",
            # 劳动节调休：4月27日（周日）上班
            "2025-04-27",
            # 国庆节调休：9月28日（周日）、10月11日（周六）上班
            "2025-09-28", "2025-10-11",
        ]

    # 转换为集合，提高查询效率
    holiday_set = set(holidays)
    workday_set = set(workdays)

    weekly_workdays = {}

    for month in months:
        year, month_num = map(int, month.split("-"))
        first_day = datetime(year, month_num, 1)

        # 计算当月最后一天
        next_month_num = 1 if month_num == 12 else month_num + 1
        next_year = year + 1 if month_num == 12 else year
        last_day = datetime(next_year, next_month_num, 1) - timedelta(days=1)

        # 找到当月所有"周一"
        current_day = first_day
        week_mondays = []

        # 找到第一个周一
        while current_day <= last_day:
            if current_day.weekday() == 0:  # 周一
                week_mondays.append(current_day)
                current_day += timedelta(days=7)
            else:
                current_day += timedelta(days=1)

        # 处理月初不是周一的情况（第0周）
        if first_day.weekday() != 0:
            first_monday_before = first_day - timedelta(days=first_day.weekday())
            week_mondays.insert(0, first_monday_before)

        # 遍历当月所有日期，分配到对应的周
        current_day = first_day
        while current_day <= last_day:
            date_str = current_day.strftime("%Y-%m-%d")

            # ⚡ 判断逻辑：
            # 1. 如果在调休工作日列表中 → 是工作日
            # 2. 如果是节假日 → 不是工作日
            # 3. 如果是周末（周六日）→ 不是工作日
            # 4. 其他情况（周一到周五且非节假日）→ 是工作日

            is_weekend = current_day.weekday() >= 5  # 周六、周日
            is_holiday = date_str in holiday_set
            is_makeup_workday = date_str in workday_set  # 调休上班日

            # 判断是否为工作日
            is_workday = is_makeup_workday or (not is_weekend and not is_holiday)

            if is_workday:
                # 找到当前日期属于哪个周
                week_number = 0
                for idx, monday in enumerate(week_mondays):
                    if current_day >= monday:
                        week_number = idx + 1
                    else:
                        break

                if week_number == 0:
                    week_number = 1

                # 生成周键
                week_key = f"{year}年{month_num}月第{week_number}周"

                if week_key not in weekly_workdays:
                    weekly_workdays[week_key] = []
                weekly_workdays[week_key].append(date_str)

            current_day += timedelta(days=1)

    return json.dumps(weekly_workdays, ensure_ascii=False, indent=4)
